﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;

namespace Slex.Lib.Interactions
{
    /// <summary>
    /// An abstract class for creating triggers based on an Observable (System.Reactive)
    /// </summary>
    public abstract class ObserverTrigger<T> : EventBasedTrigger
    {

        private IObservable<T> _observable;
        private IDisposable _currentDisposable = null;

        /// <summary>
        /// The observable to which the event is assigned
        /// </summary>
        protected IObservable<T> Observable
        {
            get
            {
                return _observable;
            }
            set
            {
                //We don't want to re-initialize
                if (_observable == value)
                    return;

                Cleanup();

                //Assigned value is null
                if (value == null)
                    return;

                _observable = value;

                _currentDisposable = _observable.Subscribe(item => OnNext(item));
                
            }
        }

        /// <summary>
        /// On next action
        /// </summary>
        /// <param name="param"></param>
        protected abstract void OnNext(object param);

        /// <summary>
        /// Disposes the observer
        /// </summary>
        public virtual void Cleanup()
        {
            if (_currentDisposable != null)
            {
                _currentDisposable.Dispose();
                _currentDisposable = null;
            }
        }

        /// <summary>
        /// Cleanup when detaching
        /// </summary>
        protected override void OnDetaching()
        {
            Cleanup();
            base.OnDetaching();
        }

    }
}
